package theMemoryModel;

/**
 * @Author: Jamie Nie
 * @Date: 2021/6/22 16:20
 * @Slogan: The harder you work, the more luck you have.
 * @desc: 对象在Eden区分配
 *
 * Minor GC和Full GC 有什么不同呢？
 * Minor GC/Young GC：指发生新生代的的垃圾收集动作，Minor GC非常频繁，回收速度一般也比较快。
 * Major GC/Full GC：一般会回收老年代 ，年轻代，方法区的垃圾，Major GC的速度一般会比Minor GC的慢10倍以上。
 *
 * Eden与Survivor区默认8:1:1
 * JVM默认有这个参数-XX:+UseAdaptiveSizePolicy(默认开启)，会导致这个8:1:1比例自动变化
 *
 * -XX:+PrintGCDetails 打印GC详情
 *
 * 大对象直接进入老年代:
 *      设置JVM参数：-XX:PretenureSizeThreshold=1000000 (单位是字节)  -XX:+UseSerialGC
 *      为了避免为大对象分配内存时的复制操作而降低效率。
 * 长期存活的对象将进入老年代:
 *      设置对象晋升到老年代的年龄阈值: -XX:MaxTenuringThreshold
 *      对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活，并且能被 Survivor 容纳的话，将被移动到 Survivor 空间中，
 *      并将对象年龄设为1。对象在 Survivor 中每熬过一次 MinorGC，年龄就增加1岁，
 *      当它的年龄增加到一定程度（默认为15岁，CMS收集器默认6岁，不同的垃圾收集器会略微有点不同），就会被晋升到老年代中。
 * 对象动态年龄判断：
 *      当前放对象的Survivor区域里(其中一块区域，放对象的那块s区)，一批对象的总大小大于这块Survivor区域内存大小的50%(-XX:TargetSurvivorRatio可以指定)，
 *      那么此时大于等于这批对象年龄最大值的对象，就可以直接进入老年代了。对象动态年龄判断机制一般是在minor gc之后触发的。
 * 老年代空间分配担保机制：
 *      年轻代每次minor gc之前JVM都会计算下老年代剩余可用空间
 *      如果这个可用空间小于年轻代里现有的所有对象大小之和(包括垃圾对象)
 *      就会看一个“-XX:-HandlePromotionFailure”(jdk1.8默认就设置了)的参数是否设置了
 *      如果有这个参数，就会看看老年代的可用内存大小，是否大于之前每一次minor gc后进入老年代的对象的平均大小。
 *      如果上一步结果是小于或者之前说的参数没有设置，那么就会触发一次Full gc，对老年代和年轻代一起回收一次垃圾，如果回收完还是没有足够空间存放新的对象就会发生"OOM"
 *      当然，如果minor gc之后剩余存活的需要挪动到老年代的对象大小还是大于老年代可用空间，那么也会触发full gc，full gc完之后如果还是没有空间放minor gc之后的存活对象，则也会发生“OOM”
 */
public class GCTest {
    public static void main(String[] args) {
        byte[] allocation1,allocation2,allocation3,allocation4,allocation5,allocation6;

        allocation1 = new byte[58000 * 1024];
//
//        allocation2 = new byte[8000 * 1024];
//
//        allocation3 = new byte[1000 * 1024];
//        allocation4 = new byte[1000 * 1024];
//        allocation5 = new byte[1000 * 1024];
//        allocation6 = new byte[1000 * 1024];
    }
}
